草庐IT

22. 多态

全部标签

c++ - 为什么 dynamic_cast 可以用于非多态类型的向上转换?

参见here:dynamic_castcanonlybeusedwithpointersandreferencestoclasses(orwithvoid*).Itspurposeistoensurethattheresultofthetypeconversionpointstoavalidcompleteobjectofthedestinationpointertype.Thisnaturallyincludespointerupcast(convertingfrompointer-to-derivedtopointer-to-base),inthesamewayasalloweda

c++ - 传递返回多态 unique_ptr 的 lambda 作为函数指针

我想传递一个非捕获的lambda,它返回一个std::unique_ptr,作为std::unique_ptr(*)()类型的函数指针.但是,这仅在我将lambda的返回类型明确声明为std::unique_ptr时才有效。.为什么要明确说明返回类型?为什么它适用于std::function没有这个额外的返回类型?#include#includestructBase{virtual~Base()=default;};structDerived:Base{};structFailsForF2{usingFunction=std::add_pointer_t()>;FailsForF2(F

c++ - 多态性:成员访问和getter给出不同的结果

代码如下:#include#include#includeclassParent{public:virtualvoidwhatAmI(){std::coutvalue=10;sc.parent->whatAmI();std::coutvaluegetValue()它返回:Achild10valuefromChild0我已经阅读了有关对象切片的内容,并确保在child被切片后我会分配值10。我仍然不明白为什么直接字段访问和函数调用会给出不同的结果。谢谢。 最佳答案 这里没有切片-您正在通过指针访问。该行为是由于成员变量访问是不是多态的

c++ - 多态 unique_ptr 复制省略

我有以下代码适用于Clang5.0,但不适用于启用了C++14的Clang3.8:classBase{};classDerived:publicBase{};std::unique_ptrMakeDerived(){autoderived=std::make_unique();returnderived;}intmain(){autobase=MakeDerived();std::coutLiveSampleHere在这种情况下,由于复制省略,返回值在技术上是移动构建的吗?如果是这样,这是否意味着unique_ptr的移动构造函数旨在支持用户类类型的隐式向上转换?从cppreferen

c++ - 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?

我想知道为什么这个程序不能编译(在msvc、gcc和clang上的行为相同):#includeusingnamespacestd;structAction{virtualvoidaction(){cout按照我的预期,删除的复制构造函数应该让其他ActionDecorator实例构造ActionDecorator,因为它是Action的多态类型。相反,我必须将ActionDecorator实例显式转换为Action&,因为编译器提示试图引用已删除的复制构造函数。是否有一些标准规则可以解释这种行为? 最佳答案 删除函数不会将其从重载决

C++:在不违反 SRP 的情况下向多态类层次结构添加方法?

我经常遇到一个设计问题。为了便于说明,我们假设我有一个多态类层次结构classA{public:virtual~A(){}...};classB:publicA{...};classC:publicB{...};classD:publicA{...};...我希望能够以多态方式打印这些类的实例,即每个类都有自己的打印方式。实现这一点的明显方法是添加virtualvoidprint(OutputStream&os)=0;进入基类并在每个子类中覆盖此方法。但是,如果类的原始职责与打印无关,这将给它们增加另一个职责,从而违反了SRP。.我的问题是:在不违反SRP的情况下实现所需行为的正确方法

c++ - 具有多态类型的 unique_ptr 未被删除

我有一个使用基类派生类型存储的unique_ptrvectorstd::unique_ptr>>decisionVariables;其中Variable是父类(superclass),派生类型是Route类。我的问题是,当包含decisionVariables的类被删除时,路由实例似乎没有被删除。路由来源于变量:#ifndef__VARIABLE__#define__VARIABLE__/***Interfacefordecisionvariables.*/#include#include#includeclassVariable{public:/***Returnsanindepen

C++ 多态接口(interface)

我正在尝试创建一种方法来处理许多不同版本的协议(protocol),类似于问题Howtohandledifferentprotocolversionstransparentlyinc++?.我同意继承链可以很好地解决这个问题。这就是我在Java中的做法:创建一个IParser接口(interface),并有几个ParserV0、ParserV1、...类,相互继承并实现IParser。我知道由于某些多重继承和虚拟技巧,在C++中创建该结构是可能的。关键在于:在Java中,如果我想要一个解析器,我想,我可以说IParserparser=getCorrectVersion(...)。我会得

c++ - Fedora 22 - 编译 - __atomic_is_lock_free

我尝试在Fedora22上编译一个软件(SuperCollider),但我遇到了一个问题:libsupernova.a(server.cpp.o):Infunction`std::atomic::is_lock_free()const':/usr/include/c++/5.1.1/atomic:212:undefinedreferenceto`__atomic_is_lock_free'collect2:error:ldreturned1exitstatusserver/supernova/CMakeFiles/supernova.dir/build.make:96:recipefo

c++ - 多态(继承)和值类型

我有一堆类型,PixelMeasure,PointMeasure,CentimeterMeasure依此类推,表示带有单位的值。我希望他们有值语义:例如有效不可变,不必担心内存分配,并且多态性:我可以返回类型为Measure的对象并且可以在不知道它是什么具体类型的情况下对其进行操作。我还希望能够放置多个不同的Measure放入容器中。似乎这些在C++中是互斥的。对于多态性,我需要使用指针或引用。我看到两个选项:使用智能指针,例如shared_ptr.这给了我想要的行为(安全,没有原始指针,但多态分派(dispatch))。缺点是:它很冗长(如果我真的想要的话,我可以将它隐藏在typed